'use strict';

const { Controller } = require('egg');
const { v4: uuidv4 } = require('uuid');
class WorkController extends Controller {
  async createWork() {
    const { ctx, service, app } = this;
    try {
      const workId = uuidv4();
      const res = await app.mysql.insert('localWork', {
        workid: workId,
        extra_json: '{}',
        user: ctx.state.user.phone, // 用户手机号码
        isPublic: 0,
        partners: '',
        coverImg: '',
      });
      // 1. 生成一个作品id
      ctx.helper.success({ ctx, res: { id: workId } });
    } catch (error) {
      ctx.helper.error({ ctx, errorType: 'userValidateFail' });
    }
  }

  // 保存时候，调用更新整体数据的保存接口
  // 发布作品时候，调用这个接口
  async saveWork() {
    const { ctx, app } = this;
    try {
      const workId = ctx.params.workId;
      const { title, coverImg, content, desc } = ctx.request.body;
      const oldWork = await app.mysql.get('localWork', { workid: workId });
      const newJson = {};
      if (coverImg) {
        newJson.coverImg = coverImg;
      }
      if (title) {
        newJson.title = title;
      }
      if (content) {
        newJson.content = content;
      }
      if (desc) {
        newJson.desc = desc;
      }
      const row = {
        extra_json: JSON.stringify({
          ...JSON.parse(oldWork.extra_json),
          ...newJson,
        }),
      };
      console.log({
        ...JSON.parse(oldWork.extra_json),
        ...newJson,
      }, 'json');
      if (coverImg) {
        row.coverImg = coverImg;
      }
      const options = {
        where: {
          workid: workId,
        },
      };
      const res = await this.app.mysql.update('localWork', row, options);
      ctx.helper.success({ ctx, res });
    } catch (error) {
      ctx.body = {
        code: -1,
        error: error.message,
      };
      // ctx.helper.error({ ctx })
    }
  }

  // 通过单个workid 获取作品
  async getWork() {
    const { ctx, app } = this;
    const { workId } = ctx.params;
    if (workId) {
      const res = await app.mysql.get('localWork', { workid: workId });
      if (res) {
        ctx.helper.success({ ctx, res });
      } else {
        ctx.helper.error({ ctx, errorType: 'workNoFound' });
      }
    } else {
      ctx.helper.error({ ctx, errorType: 'workNoFound' });
    }
  }
  // 通过用户手机号查询用户当前的作品
  async getUserWork() {
    const { ctx, app } = this;
    try {
      const { pageIndex, pageSize } = ctx.query;
      const { phone } = ctx.state.user;
      const res = await this.app.mysql.select('localWork', {
        where: { user: phone },
        orders: [['id', 'desc']], // 排序方式
        limit: parseInt(pageSize), // 返回数据量
        offset: pageIndex * pageSize, // 数据偏移量
      });
      const total = await this.app.mysql.query(
        'SELECT COUNT(*) AS total_count FROM localWork where user=?',
        [phone]
      );
      ctx.helper.success({
        ctx,
        res: { total: total[0].total_count, list: res },
      });
    } catch (error) {
      this.ctx.body = {
        code: -1,
        error,
      };
    }
  }

  /**
   * 发布接口，用来更新模版的isPublic状态
   */
  async publish() {
    const { ctx, app } = this;
    try {
      const workId = ctx.params.workId;
      const row = {
        isPublic: 1,
      };
      const options = {
        where: {
          workid: workId,
        },
      };
      const res = await this.app.mysql.update('localWork', row, options);
      ctx.helper.success({ ctx, res });
    } catch (err) {
      ctx.body = {
        code: -1,
        error: error.message,
      };
    }
  }

  // 更新当前任务：

  // 上传
  // async createChannel() {
  //   const { ctx } = this
  //   const { name, workId } = ctx.request.body
  //   const newChannel = {
  //     name,
  //     id: uuidv4(),
  //   }
  //   const res = await ctx.model.Work.findOneAndUpdate(
  //     { id: workId },
  //     { $push: { channels: newChannel } }
  //   )
  //   if (res) {
  //     ctx.helper.success({ ctx, res: newChannel })
  //   } else {
  //     ctx.helper.error({ ctx, errorType: 'channelOperateFail' })
  //   }
  // }
  // async getWorkChannel() {
  //   const { ctx } = this
  //   const { id } = ctx.params
  //   const certianWork = await ctx.model.Work.findOne({ id })
  //   if (certianWork) {
  //     const { channels } = certianWork
  //     ctx.helper.success({
  //       ctx,
  //       res: {
  //         count: (channels && channels.length) || 0,
  //         list: channels || [],
  //       },
  //     })
  //   } else {
  //     ctx.helper.error({ ctx, errorType: 'channelOperateFail' })
  //   }
  // }
  // async updateChannelName() {
  //   const { ctx } = this
  //   const { id } = ctx.params
  //   const { name } = ctx.request.body
  //   const res = await ctx.model.Work.findOneAndUpdate(
  //     { 'channels.id': id },
  //     { $set: { 'channels.$.name': name } }
  //   )
  //   if (res) {
  //     ctx.helper.success({ ctx, res: { name } })
  //   } else {
  //     ctx.helper.error({ ctx, errorType: 'channelOperateFail' })
  //   }
  // }
  // async deleteChannel() {
  //   const { ctx } = this
  //   const { id } = ctx.params
  //   const work = await ctx.model.Work.findOneAndUpdate(
  //     { 'channels.id': id },
  //     { $pull: { channels: { id } } },
  //     { new: true }
  //   )
  //   if (work) {
  //     ctx.helper.success({ ctx, res: work })
  //   } else {
  //     ctx.helper.error({ ctx, errorType: 'channelOperateFail' })
  //   }
  // }
  // async createWork() {
  //   const { ctx, service } = this
  //   const workData = await service.work.createEmptyWork(ctx.request.body)
  //   ctx.helper.success({ ctx, res: workData })
  // }
  // async copyWork() {
  //   const { ctx } = this
  //   const { id } = ctx.params
  //   try {
  //     const res = await ctx.service.work.copyWork(parseInt(id))
  //     ctx.helper.success({ ctx, res })
  //   } catch (e) {
  //     return ctx.helper.error({ ctx, errorType: 'workNoPublicFail' })
  //   }
  // }
  // async update() {
  //   const { ctx } = this
  //   const { id } = ctx.params
  //   const payload = ctx.request.body
  //   const res = await this.ctx.model.Work.findOneAndUpdate({ id }, payload, {
  //     new: true,
  //   }).lean()
  //   ctx.helper.success({ ctx, res })
  // }
  // async delete() {
  //   const { ctx } = this
  //   const { id } = ctx.params
  //   const res = await this.ctx.model.Work.findOneAndDelete({ id })
  //     .select('_id id title')
  //     .lean()
  //   ctx.helper.success({ ctx, res })
  // }
  // async publish(isTemplate) {
  //   const { ctx } = this
  //   const url = await this.service.work.publish(ctx.params.id, isTemplate)
  //   ctx.helper.success({ ctx, res: { url } })
  // }
  // async publishWork() {
  //   await this.publish(false)
  // }
  // async publishTemplate() {
  //   await this.publish(true)
  // }
}

module.exports = WorkController;
